Azure SQL SESSION 您所在的位置:网站首页 windows 安全等级 Azure SQL SESSION

Azure SQL SESSION

2023-05-14 03:30| 来源: 网络整理| 查看: 265

SESSION_CONTEXT和行级别安全性 项目 05/08/2023 SESSION_CONTEXT

对于Azure SQL和SQL Server,数据 API 生成器可以利用 将SESSION_CONTEXT用户指定的元数据发送到基础数据库。 此类元数据可通过访问令牌中的声明提供给数据 API 生成器。 然后,可以使用发送到数据库的数据配置其他安全级别 (例如,通过配置安全策略) 进一步阻止访问 SELECT、UPDATE、DELETE 等操作中的数据。 在数据库连接期间,数据 SESSION_CONTEXT 可供数据库使用,直到该连接关闭为止。 同样,可以在存储过程内使用相同的数据。

如何读取和写入 SESSION_CONTEXT

有关设置 SESSION_CONTEXT 数据的详细信息,请参阅 sp_set_session_contextMicrosoft Learn 一文。

如何在数据 API 生成器中启用SESSION_CONTEXT

在配置文件中 data-source ,节子键 options 保存数据库特定的配置属性。 若要启用 SESSION_CONTEXT,用户需要将 属性 set-session-context 设置为 true。 这可以在首次或稍后通过 CLI 生成配置文件时完成,方法是在配置文件中手动设置 属性。

用于设置 的 CLI 命令 SESSION_CONTEXT

使用 命令 dab init 生成配置文件。 标志 --set-session-context 可用于将 属性设置为 SESSION_CONTEXTtrue。 命令如下所示:

dab init -c config.json --database-type mssql --connection-string some-connection-string --set-session-context true

这会在配置文件中生成数据源部分,如下所示:

"data-source": { "database-type": "mssql", "options": { "set-session-context": true }, "connection-string": "some-connection-string" } 如何以及通过SESSION_CONTEXT发送哪些数据

EasyAuth/JWT 令牌中的所有声明都通过 SESSION_CONTEXT 发送到基础数据库。 解码的 EasyAuth 令牌示例如下所示:

{ "auth_typ": "aad", "claims": [ { "typ": "aud", "val": "" }, { "typ": "iss", "val": "https://login.microsoftonline.com//v2.0" }, { "typ": "iat", "val": "1637043209" }, { "typ": "nbf", "val": "1637043209" }, { "typ": "exp", "val": "1637048193" }, { "typ": "aio", "val": "ATQAy/8TAAAAGf/W0I7stMr3YH5iHFvESie38+INPT+Zf/p+ByYjTE5TsfeZud/5gqrpBpC1qUsD" }, { "typ": "azp", "val": "a903e2e6-fd13-4502-8cae-9e09f86b7a6c" }, { "typ": "azpacr", "val": "1" }, { "typ": "name", "val": "Sean" }, { "typ": "uti", "val": "_sSP3AwBY0SucuqqJyjEAA" }, { "typ": "ver", "val": "2.0" } ], "name_typ": "http://schemas.xmlsoap.org/ws/2005/05/identity/claims/name", "role_typ": "http://schemas.microsoft.com/ws/2008/06/identity/claims/role" }

令牌中存在的所有声明都转换为通过 SESSION_CONTEXT 接下来制定的查询传递的键值对:

EXEC sp_set_session_context 'aud', '', @read_only = 1; EXEC sp_set_session_context 'iss', 'https://login.microsoftonline.com//v2.0', @read_only = 1; EXEC sp_set_session_context 'iat', '1637043209', @read_only = 1; EXEC sp_set_session_context 'nbf', '1637043209', @read_only = 1; EXEC sp_set_session_context 'exp', '1637048193', @read_only = 1; EXEC sp_set_session_context 'aio', 'ATQAy/8TAAAAGf/W0I7stMr3YH5iHFvESie38+INPT+Zf/p+ByYjTE5TsfeZud/5gqrpBpC1qUsD', @read_only = 1; EXEC sp_set_session_context 'azp', 'a903e2e6-fd13-4502-8cae-9e09f86b7a6c', @read_only = 1; EXEC sp_set_session_context 'azpacr', 1, @read_only = 1; EXEC sp_set_session_context 'name', 'Sean', @read_only = 1; EXEC sp_set_session_context 'uti', '_sSP3AwBY0SucuqqJyjEAA', @read_only = 1; EXEC sp_set_session_context 'ver', '2.0', @read_only = 1; 示例:如何使用 SESSION_CONTEXT (RLS) 利用行级别安全性

有关行级别安全性 (RLS) 的详细信息,请参阅此 Microsoft Learn 文章。

在此演示中,我们首先创建数据库表 revenues。 接下来,我们配置一个 安全策略 ,将 FILTER PREDICATE 添加到此 revenues 表。 FILTER PREDICATE 只是一个表值函数,它根据为函数配置的条件筛选 SELECT、UPDATE、DELETE 操作可访问的行。 在演示结束时,我们看到只有这些行返回给与安全策略施加的筛选器谓词的条件匹配的用户。

为 - SQL 查询打下基础工作SESSION_CONTEXT

可以通过 SSMS 或任何其他 SQL 客户端以相同的顺序执行以下 SQL 查询,为SESSION_CONTEXT打下基础。

创建收入表 CREATE TABLE revenues( id int PRIMARY KEY, category varchar(max) NOT NULL, revenue int, username varchar(max) NOT NULL ); INSERT INTO revenues(id, category, revenue, username) VALUES (1, 'Book', 5000, 'Sean'), (2, 'Comics', 10000, 'Sean'), (3, 'Journals', 20000, 'Davide'), (4, 'Series', 40000, 'Davide'); 创建用作 FILTER PREDICATE 的函数

创建一个函数,以用作安全策略的筛选器谓词,以限制对表中的行的访问,以便执行 SELECT、UPDATE、DELETE 操作。 我们使用 变量 @username 来存储列 revenues.username 的值,然后使用条件 @username = SESSION_CONTEXT(N'name')为 的筛选器谓词筛选用户可访问的行。

CREATE FUNCTION dbo.revenuesPredicate(@username varchar(max)) RETURNS TABLE WITH SCHEMABINDING AS RETURN SELECT 1 AS fn_securitypredicate_result WHERE @username = CAST(SESSION_CONTEXT(N'name') AS varchar(max)); 创建要添加到收入表的安全策略

添加安全策略,以限制对使用筛选器谓词 dbo.revenuesPredicate 的 SELECT、UPDATE、DELETE 操作的收入表中行的访问。

CREATE SECURITY POLICY dbo.revenuesSecPolicy ADD FILTER PREDICATE dbo.revenuesPredicate(username) ON dbo.revenues; SESSION_CONTEXT在操作中

现在,我们已经为SESSION_CONTEXT奠定了基础,是时候看看它的行动了。

EXEC sp_set_session_context 'name', 'Sean'; -- setting the value of 'name' key in SESSION_CONTEXT; SELECT * FROM dbo.revenues; 结果

返回对应于 username “Sean” 的行,因为只有这些行符合安全策略施加的筛选器谓词的条件。

注意

如果未 SESSION_CONTEXT 设置 ,则会为 中 SESSION_CONTEXT 引用的任何键分配 null 值,并且不会引发错误。 在此示例中,查询不会返回任何行,因为筛选器谓词将为每个行返回 0 (false) ,即用户无法访问该行。



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有